package ar.uba.is2.ec.matem.motor.impl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

import ar.uba.is2.common.mensaje.contenido.Dato;
import ar.uba.is2.common.mensaje.contenido.Identificador;
import ar.uba.is2.ec.config.Contexto;
import ar.uba.is2.ec.matem.datos.EstadoMeteorologico;
import ar.uba.is2.ec.matem.datos.Medicion;
import ar.uba.is2.ec.matem.datos.ResultadoDeModelo;
import ar.uba.is2.ec.matem.motor.Regla;

public abstract class ReglaAbstracta implements Regla {

	private Collection<Identificador> datosRequeridos;
	
	public ReglaAbstracta() {
		this.datosRequeridos = new ArrayList<Identificador>();
	}
	
	public void addDatoRequerido( Identificador identificador ) {
		this.datosRequeridos.add(identificador);
	}
	
	@Override
	public ResultadoDeModelo aplicar(Collection<Dato> datos) {
		
		for (Dato dato : datos) {
			EstadoMeteorologico estado;
			if(dato instanceof Medicion){
				estado = aplicarMedicion((Medicion)dato);
			} else {
				estado = aplicarResultado((ResultadoDeModelo)dato);
			}
			if (estado.ordinal() >= EstadoMeteorologico.HURACAN.ordinal()) {
				ResultadoDeModelo resultado = new ResultadoDeModelo();
				
				resultado.setId(ResultadoDeModelo.proxId());
				resultado.setFecha(new Date());
				resultado.setValor(EstadoMeteorologico.EXPLOSION_PLANETARIA);
				resultado.setCoordenada(Contexto.instance.getConfiguracionGeneralEC().getCoordenada());
				
				return resultado;
			}
		}

		ResultadoDeModelo resultado = new ResultadoDeModelo();
		
		resultado.setId(ResultadoDeModelo.proxId());
		resultado.setFecha(new Date());
		resultado.setValor(EstadoMeteorologico.SOL);
		resultado.setCoordenada(Contexto.instance.getConfiguracionGeneralEC().getCoordenada());

		return resultado;
	}
	
	@Override
	public Collection<Identificador> getDatosRequeridos() {
		return this.datosRequeridos;
	}

	protected abstract EstadoMeteorologico aplicarMedicion(Medicion medicion);

	protected EstadoMeteorologico aplicarResultado(ResultadoDeModelo dato) {
		return dato.getEstadoMeteorologico();
	}



}
